package com.gai.shop.web.controller;

import cn.dsna.util.images.ValidateCode;
import com.gai.shop.common.Const;
import com.gai.shop.entity.User;
import com.gai.shop.service.UserService;
import com.gai.shop.service.impl.UserServiceImpl;
import com.gai.shop.util.*;
import org.apache.commons.beanutils.BeanUtils;

import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.util.Map;

public class UserController extends BaseController {
//    @Override
//    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//        String method = request.getParameter("method");
//        switch (method){
//            case "reg":
//                //根据传递的参数调用不同的f'f方法
//                reg(request,response);
//                break;
//            case "login":
//                login(request,response);
//                break;
//            default:
//                break;
//        }
//    }
//
//    //3编写对应的处理业务的方法
//    public String login(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//        response.getWriter().println("这个是login登录方法的响应");
//        System.out.println("=========UserController login=========");
//        return "/login.jsp";
//    }
//
//    public String reg(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//        System.out.println("注册");
//        //拿用户数据
//        String uname = request.getParameter("uname");
//        System.out.println("已经拿到参数了，这里是reg()注册的方法:"+uname);
//        return "/index.jsp";
//    }

    private final UserService US = new UserServiceImpl();

    /**
     * 验证用户名是否重复 AJAX
     * @param request
     * @param response
     * @return
     * @throws ServletException
     * @throws IOException
     */
    public String checkUserName(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String uname = request.getParameter("uname");
        User user = US.selectUserByUname(uname);
        if (user != null){
            //如果不为空即用户已存在返回1
            return "1";
        }
        return "0";
    }

    /**
     * 注册方法
     * 1.获取用户传递参数
     * 1.1使用BeanUtils.populate(u,parameterMap); 来帮助数据封装,
     *      需要2个条件:1.前端表单里面的name值必须要和我们实体类的属性的名称一致,2.实体类里面的属性必须要有对应的getset方法
     * 2.手动进行剩余数据的封装如用户状态,用户权限,邮件的激活码手动进行设置
     * 3.用户密码的加密 使用md5进行加密
     * 4.发送业务层进行用户注册
     * 5.给出响应 成功就跳转注册成功页面,失败转发到注册页面给与失败提示
     * @param request
     * @param response
     * @return
     * @throws ServletException
     * @throws IOException
     */
    public String register(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //username password email user //id ustatus0 1 ucode urole0 1
        //前提条件 前端表单里面的name值必须要和我们实体类的属性的名称一致
        //实体类里面的属性必须要有对应的getset方法
        //封装数据
        //使用工具类
        //1需要给一个实体类，让工具帮我们进行属性的封装
        User user = new User();
        //2.通过request获取一个getParameterMap()里面前端提交过来的所有的数据
        //k=表单的name的值 v=表单对应的value
        Map<String, String[]> parameterMap = request.getParameterMap();
        try {
            BeanUtils.populate(user, parameterMap);//进行数据封装
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
        //其他数据的手动设置
        user.setUrole(Const.UserConst.IS_MUNBER);//设置注册用户为会员
        user.setUstatus(Const.UserConst.HAS_NOT_ACTIVE);//设置用户未激活

        //设置激活码,用户会通过邮件里附带的用户激活码进行查找用户并激活
        //必须唯一
        user.setUcode(RandomUtils.createActive());
        //进行用户密码的加密
        user.setUpassword(MD5Utils.md5(user.getUpassword()));
        //所有参数属性都封装，访问业务层进行注册
        Integer result = US.addUser(user);
        if (result > 0){
            //加入邮件的发送
            EmailUtils.sendEmail(user);
            return Const.REDIRECT + "/registerSuccess.jsp";
        }else {
            //注册失败
            request.setAttribute(Const.MESSAGE,"注册失败");
            return Const.FORWARD + "/register.jsp";
        }
    }

    /**
     *
     * @param request
     * @param response
     * @return
     * @throws ServletException
     * @throws IOException
     */
    public String activate(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String e = request.getParameter("e");
        String c = request.getParameter("c");
        //解码 用户的邮箱和激活码
        String uemail = Base64Utils.decode(e);
        String ucode = Base64Utils.decode(c);
        Integer result = US.activeUser(uemail, ucode);
        String msg = "激活失败";
        if (result == 1){
            //i=1
            msg = "激活成功";
        }else if (result == 2){
            //i=2
            msg = "已经激活，无需再次激活";
        }else {
            //i = 0
            msg = "激活失败";
        }
        request.setAttribute(Const.MESSAGE, msg);
        return Const.FORWARD + "/message.jsp";
    }

    /**
     *
     * @param request
     * @param response
     * @return
     * @throws ServletException
     * @throws IOException
     */
//    public String login(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//        String uname = request.getParameter("uname");
//        String upassword = request.getParameter("upassword");
//
//        //有这个用户名的用户存在 并且 密码和用户输入密码是相同的
//          User user = US.login(uname, upassword);
//          if (user != null && user.getUpassword().equals(MD5Utils.md5(upassword))){
//              if (user.getUstatus() == 1){
//                 //登录成功
//                  return Const.REDIRECT + "/index.jsp";
//              }
//          }
//
//        User user = US.selectUserByUname(uname);
//        if (user == null){
//            request.setAttribute(Const.MESSAGE,"用户不存在");
//            return  Const.FORWARD + "/login.jsp";
//        }
//        if (!user.getUpassword().equals(MD5Utils.md5(upassword))){
//            request.setAttribute(Const.MESSAGE,"用户名或密码有误");
//            return Const.FORWARD + "/login.jsp";
//        }
//        request.getSession().setAttribute(Const.LOGIN_USER,user);
//        return Const.FORWARD + "/index.jsp";
//    }

    /**
     * 自动登录
     * 1.获取参数，来判断用户是否选择了2周自动登录
     * 选择：on  没有选择：null
     * 知道用户是否选择
     * 前台：登录成功
     * 2.保存信息到cookie里面，设置2周
     * 3.保存什么值，用户名和没有加密的密码
     * 4.保存到cookie用户名和密码是否可见，不应该让其他人可见，加密Base64，当需要使用就解码
     * 5.我们怎么样可以做到，当用户设置了2周保存并且登录成功过后，当用户再次访问login.jsp的时候，帮他们做自动登录然后跳转index.jsp首页
     *      5.1 我们怎么知道用户是去login.jsp
     *      5.2使用过滤器进行精确过滤/login.jsp这个页面，检查cookie，如果里面有值===>重新验证用户名和密码===>对的?自动登录(帮助用户登录):放行去login.jsp页面
     * 6.在过滤器中检查用户cookie 使用userServices里面的方法 进行用户名和密码的验证，通过就保存用户信息到session，然后重定向到index.jsp，没有通过就放行让用户去login.jsp自己登录
     * @param request
     * @param response
     * @return
     * @throws ServletException
     * @throws IOException
     */
    public String login(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String auto = request.getParameter("auto");//获取用户是否选择了自动登录
        String uname = request.getParameter("uname");
        String upassword = request.getParameter("upassword");

        //有这个用户名的用户存在 并且 密码和用户输入密码是相同的
//        User user = US.login(uname, upassword);
//        if (user != null && user.getUpassword().equals(MD5Utils.md5(upassword))){
//            if (user.getUstatus() == 1){
//                //登录成功
//                return Const.REDIRECT + "/index.jsp";
//            }
//        }

        User user = US.selectUserByUname(uname);
        if (user == null){
            request.setAttribute(Const.MESSAGE,"用户不存在");
            return  Const.FORWARD + "/login.jsp";
        }
        if (!user.getUpassword().equals(MD5Utils.md5(upassword))){
            request.setAttribute(Const.MESSAGE,"用户名或密码有误");
            return Const.FORWARD + "/login.jsp";
        }
        request.getSession().setAttribute(Const.LOGIN_USER,user);
        //设置自动登录
        if (auto != null){
            //保存用户名和密码，都要进行加密Base64，转为字符串进行保存
            //gai:e10adc3949ba59abbe56e057f20f883e
            String value = user.getUname()+Const.COLON+user.getUpassword();
            //加密
            value = Base64Utils.encode(value);
            Cookie cookie = new Cookie(Const.UserConst.AUTO_LOGIN,value);
            cookie.setPath("/");
            cookie.setMaxAge(60*60*24*14);
            response.addCookie(cookie);
        }else {
            Cookie cookie = new Cookie(Const.UserConst.AUTO_LOGIN,"");
            cookie.setPath("/");
            cookie.setMaxAge(0);//设置清空，为了防止出现属性错误问题或残留问题
            response.addCookie(cookie);
        }
        return Const.FORWARD + "/index.jsp";
    }

    /**
     * 注销
     * @param request
     * @param response
     * @return
     * @throws ServletException
     * @throws IOException
     */
    public String logout(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //清除session中的登录信息
        request.getSession().removeAttribute(Const.LOGIN_USER);
        //清除cookie保存的信息
        Cookie cookie = new Cookie(Const.UserConst.AUTO_LOGIN,"");
        cookie.setPath("/");
        cookie.setMaxAge(0);//设置清空，为了防止出现属性错误问题或残留问题
        response.addCookie(cookie);
        return Const.REDIRECT + "/index.jsp";
    }
}
